Dropping values 主要用途是將特定的值丟掉,丟掉的條件有以下三種用法。
dropFirst 裡面可以帶一個 interger的參數,來決定 publisher 發出來的元素從地一個開始數地幾個。
publisher
.dropFirst(2)
.sink(receiveValue: { print($0) })
.store(in: &subscriptions)
interger可以不帶參數,那麼就是預設的只drop 第一個元素。
publisher
.dropFirst()
.sink(receiveValue: { print($0) })
.store(in: &subscriptions)
關於 dropFirst 事實上在 Sequence 裡面有一個類似的方法,而概念是一樣的,也就是 drop 指定數量的元素。可以看這個延伸閱讀。
裡面帶一個 closure,這個 closure 返回一個 Bool,當這個 Bool 為true 之前,前面的元素通通drop。反之則保留。
publisher
.drop(while: {
return $0 % 5 != 0
})
.sink(receiveValue: { print($0) })
.store(in: &subscriptions)
可以注意的是,你可能會認為這個跟 filter 很像。但是他們其實是完全不一樣的東西。
這個方法比較特殊,drop 的條件不是判斷當前 publisher拋出的元素,而是判斷另外一個 publisher的訊號。drop 只要通過了closure的驗證,後面就會全部通過。 而 filter 不一樣,每一個元素都需要通過closure的驗證。
let upstream = PassthroughSubject<Int,Never>()
let second = PassthroughSubject<String,Never>()
cancellable = upstream
.drop(untilOutputFrom: second)
.sink { print("\($0)", terminator: " ") }
upstream.send(1)
upstream.send(2)
second.send("A")
upstream.send(3)
upstream.send(4)